#ifndef _SCIENCE_MATHEMATICS_ALGEBRA_EQUATION_ONE_VARIABLE_H_
#define _SCIENCE_MATHEMATICS_ALGEBRA_EQUATION_ONE_VARIABLE_H_
//-----------------------------------------------------------------------------------------------------//
//																	                                   //
// equation_one_variable.h  contains definitions of the equation in one variable                       //
//																									   //
// author	: Eng. Ahmed Yasser																		   //
// data		: 21-01-2015																			   //
//																	                                   //
//-----------------------------------------------------------------------------------------------------//

#include <vector>

#include "..\..\..\common\include\opengl_draws.h"
#include "interval.h"
#include "ordered_pair.h"
#include "cartesian_plane.h"

//-----------------------------------------------------------------------------------------------------//
//																									   //
// the structures that define the equation in one variable											   //
//																									   //
//-----------------------------------------------------------------------------------------------------//

typedef float(*eq_one_variable_ptr)(float);

// the equation_one_variable type
struct equation_one_variable_t
{
	eq_one_variable_ptr f;	// the function that evaluates the equation
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: create_equation_one_variable													           //
//																									   //
// desc		: create an equation on one variable on the domain specified						       //
//																									   //
// params	:																						   //
//		eq_one_variable_ptr f	: the function that evaluates the equation							   //
// returns	: the created equation																	   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
equation_one_variable_t create_equation_one_variable(eq_one_variable_ptr f);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: evaluate_equation_one_variable												           //
//																									   //
// desc		: evaluate the equation to the specified value										       //
//																									   //
// params	:																						   //
//		const equation_one_variable_t& eq	: the equation											   //
//      float x : the value to be evaluate															   //
// returns	: the evaluated value																	   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
float evaluate_equation_one_variable(const equation_one_variable_t& eq, float x);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: evaluate_equation_one_variable												           //
//																									   //
// desc		: evaluate the equation to the specified values										       //
//																									   //
// params	:																						   //
//		const equation_one_variable_t& eq	: the equation											   //
//      std::vector<float> xs : the values to be evaluate											   //
// returns	: the evaluated values																	   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
std::vector<float> evaluate_equation_one_variable(const equation_one_variable_t& eq, std::vector<float> xs);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: evaluate_equation_one_variable_on_interval									           //
//																									   //
// desc		: evaluate the equation on interval													       //
//																									   //
// params	:																						   //
//		const equation_one_variable_t& eq	: the equation											   //
//      interval_t interval : the interval to evaluate equation on									   //
//      float step : the step used in evaluating the equation										   //
// returns	: the evaluated values																	   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
std::vector<ordered_pair> evaluate_equation_one_variable_on_interval(const equation_one_variable_t& eq, interval_t interval, float step);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: graph_equation_one_variable													           //
//																									   //
// desc		: graph the equation on the specified interval										       //
//																									   //
// params	:																						   //
//		const equation_one_variable_t& eq	: the equation to be graphed							   //
//      interval_t interval : the interval to graph equation on										   //
//      float step : the step used in graphing the equation										   //
//		float r	: the red color of the equation graph											   //
//		float g	: the green color of the equation graph											   //
//		float b	: the blue color of the equation graph											   //
//		float a	: the alpha color of the equation graph											   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void graph_equation_one_variable(const equation_one_variable_t& eq, interval_t interval, float step, float r, float g, float b, float a);

#endif